#include "组长.h"

void list_users_by_type(int fd, char *type)
{
    // 发送请求获取所有任务类型相同的员工
    MSG m1;
    m1.type = printfuser;
    strncpy(m1.data, type, sizeof(m1.data) - 1);
    m1.data[sizeof(m1.data) - 1] = '\0'; // 确保字符串以 null 结尾
    send(fd, &m1, sizeof(m1), 0);

    printf("任务类型相同的员工:\n");
    while (1)
    {
        if (recv(fd, &m1, sizeof(m1), 0) <= 0)
        {
            perror("接收员工信息失败");
            return;
        }

        if (m1.type == printfuser)
        {
            W_REGIST *user = (W_REGIST *)m1.data;
            printf("姓名: %s, 工号: %d\n", user->name, user->numb);
        }
        else if (m1.type == over)
        {
            break; // 收到结束标志，退出循环
        }
        else
        {
            printf("未知的消息类型\n");
        }
    }
}

void send_task_to_user(int fd, char *user_name, char * group_name,int user_id, char *task_name, char *type)
{
    
    TAST username;
    strcpy(username.tastname, task_name);
    strcpy(username.workername, user_name);
    strcpy(username.groupername, group_name);
    strcpy(username.type, type);
    username.id = user_id; // 假设 TAST 结构体中有 id 字段

    MSG m1;
    m1.type = addtask;
    memcpy(m1.data, &username, sizeof(username));

    if (send(fd, &m1, sizeof(m1), 0) <= 0)
    {
        perror("发送任务名称失败");
        return;
    }

    if (recv(fd, &m1, sizeof(m1), 0) <= 0)
    {
        perror("接收响应失败");
        return;
    }

    if (m1.type == yes)
    {
        printf("添加任务成功\n");
    }
    else
    {
        printf("添加任务失败\n");
    }
}

int addtest(int fd, B_REGIST lg)
{
    TAST username;
    char type[128];
    if (lg.type_B == 0)
    {
        strcpy(type, "行政管理部门");
    }
    else if (lg.type_B == 1)
    {
        strcpy(type, "财务部门");
    }
    else if (lg.type_B == 2)
    {
        strcpy(type, "人事部门");
    }
    else if (lg.type_B == 3)
    {
        strcpy(type, "研发部门");
    }
    else if (lg.type_B == 4)
    {
        strcpy(type, "销售部门");
    }
    strcpy(username.type, type);

    char choice[16];
    printf("请选择任务发送方式: 1.群发 2.单独发送\n");
    scanf("%15s", choice); // 限制输入长度
    getchar();

    printf("请输入任务名称:");
    scanf("%s", username.tastname);
    getchar();

    if (strcmp(choice, "2") == 0)
    {
        // 单独发送任务
        list_users_by_type(fd, type);
        char user_name[128];
        int user_id;
        printf("请输入接收任务的员工姓名:");
        scanf("%s", user_name);
        getchar();
        printf("请输入接收任务的员工工号:");
        scanf("%d", &user_id);
        getchar();
        char group_name[128];
        strcpy(group_name, lg.name);
        
        send_task_to_user(fd, user_name,group_name, user_id, username.tastname, type);
    }
    else
    {
        // 群发任务
        strcpy(username.groupername, lg.name);
        MSG m1;
        m1.type = alladdtask;
        memcpy(m1.data, &username, sizeof(username));

        if (send(fd, &m1, sizeof(m1), 0) <= 0)
        {
            perror("发送任务名称失败");
            return -1;
        }

        if (recv(fd, &m1, sizeof(m1), 0) <= 0)
        {
            perror("接收响应失败");
            return -1;
        }

        if (m1.type == yes)
        {
            printf("添加任务成功\n");
        }
        else
        {
            printf("添加任务失败\n");
        }
    }

    return 0;
}


int deltesk(int fd, char *name)
{
    delTEST username;
    printf("请输入要删除的任务id：");
    scanf("%d", &username.id);
    getchar();
    strcpy(username.name, name);
    MSG m1;
    memcpy(&m1.data, &username, sizeof(username));

    m1.type = deltask;
    send(fd, &m1, sizeof(m1), 0);
    if (recv(fd, &m1, sizeof(m1), 0) == -1)
    {
        perror("recv");
        return -1;
    }

    if (m1.type == yes)
    {
        printf("删除任务成功\n");
    }
    else
    {
        printf("删除任务失败\n");
    }
}

int printf_task(int fd, char *name)
{
    PRINTFTASK printTask;
    strncpy(printTask.name, name, sizeof(printTask.name) - 1);
    printTask.name[sizeof(printTask.name) - 1] = '\0'; // 确保字符串以 null 结尾

    MSG m1;
    m1.type = printftask;
    memcpy(m1.data, &printTask, sizeof(printTask));

    if (send(fd, &m1, sizeof(m1), 0) <= 0)
    {
        perror("发送请求失败");
        return -1;
    }

    while (1)
    {
        if (recv(fd, &m1, sizeof(m1), 0) <= 0)
        {
            perror("接收任务信息失败");
            return -1;
        }

        if (m1.type == taskinfo)
        {
            TASK *task = (TASK *)m1.data;
            printf("任务ID: %d, 任务名称: %s, 完成进度: %s\n", task->id, task->name, task->progress);
        }
        else if (m1.type == over)
        {
            break; // 收到结束标志，退出循环
        }
        else
        {
            printf("未知的消息类型\n");
        }
    }
    printf("\n");
    return 0;
}

void overdelworker(int fd)
{
    MSG m1;
    m1.type = printfdelworker;
    int ret = send(fd, &m1, sizeof(m1), 0);
    if (ret == -1)
    {
        perror("数据发送失败");
        return;
    }

    ret = recv(fd, &m1, sizeof(m1), 0);
    if (ret == -1)
    {
        perror("数据接收失败");
        return;
    }

    if (m1.type == over)
    {
        printf("没有待处理的离职请求。\n");
        return;
    }

    printf("待处理的离职请求:\n");
    while (m1.type != over)
    {
        char worker_name[128];
        int worker_id;
        sscanf(m1.data, "%s %d", worker_name, &worker_id);
        printf("组员名: %s, 工号: %d\n", worker_name, worker_id);
        ret = recv(fd, &m1, sizeof(m1), 0);
        if (ret == -1)
        {
            perror("数据接收失败");
            return;
        }
    }

    // 打印提醒信息
    printf("注意: 在处理离职请求前，请确认组员是否有未完成的任务。\n");

    printf("请输入要处理的组员工号（输入 '退出' 以返回）:\n");
    char input[16];
    scanf("%15s", input); // 限制输入长度
    getchar();

    if (strcmp(input, "退出") == 0)
    {
        return;
    }

    int worker_id = atoi(input);

    // 发送确认删除请求
    m1.type = delworker_confirm;
    sprintf(m1.data, "%d", worker_id);
    ret = send(fd, &m1, sizeof(m1), 0);
    if (ret == -1)
    {
        perror("数据发送失败");
        return;
    }

    // 接收处理结果
    ret = recv(fd, &m1, sizeof(m1), 0);

    if (ret == -1)
    {
        perror("数据接收失败");
        return;
    }

    if (m1.type == yes)
    {
        printf("已处理离职请求。\n");
    }
    else if (m1.type == no)
    {
        printf("注意: %s\n", m1.data);
    }
    else
    {
        printf("处理离职请求失败。\n");
    }
}

// 添加处理提醒消息的函数
void handle_reminder_msg(MSG m1)
{
    printf("提醒: %s\n", m1.data);
}